#ifndef _CONSTANTES_H_
#define _CONSTANTES_H_

#include <iostream>
#include <list>
#include <vector>
#include <iterator>
#include <time.h>
#include <math.h>
#include <fstream>
#include <map>
#include <set>
#include <limits>
#include <string>
#include <sstream>
#include <algorithm>

#include "xmlread.h"

#define ABSOLUTE(x) ((x)<0)?(-1)*(x):(x)


using namespace std;

/**************************/
/*	ESTRUCTURAS DE DATOS */	
/*************************/

typedef struct{
	double f_ini;
	double f_fin;
	time_t t_ini;
	int gen;
}datos_genetico;

typedef struct
{
	double fitness_value;
	int poblacion;
	double select_prob;		//probabilidad de selección
	bool es_padre;
	int	cruces;
	vector<Box> list_A;
	vector<Box> list_B;
	list<Container> orden;
} Solucion;


typedef	struct 
{
	vector<pair<int,Box> > cajas;
	vector<pair<int,double> > ocupacion;

}secuencia;

//Datos para calcular la mezcla de contenedores
typedef struct{
	double ocupacion_total;
	pair<int,int> ids;
}datos_mezcla;


/*******************************/
/****** Variables globales *****/
/*******************************/
vector<Container> *ocupados;

/****************/
/*	CONSTANTES	*/
/****************/

//Dimensiones del contenedor
int	WIDTH,
	HEIGHT,
	DEPTH,
	WEIGHT;

//Fichero de entrada de datos
string CONFIG_FILE="config.xml",
	   INPUT_FILE,
	   OUTPUT_FILE;

//Número máximo de generaciones
int GEN_MAX;

//Tamaño inicial de la poblacion
int	INIT_POP_SIZE;

//Tipo de la generacion inicial
int TYPE_GEN;

//Probabilidades de realizar cruce o mutación
double CROSS_PROB,
	   MUTAT_PROB;

//Operador de cruce seleccionado
int CROSS_OPERATOR;

//Operador de mutación seleccionado
int MUTAT_OPERATOR;

//Operador de fitness seleccionado
int FIT_OPERATOR;

//Operador de selección
int SELECT_OPERATOR;
double TOURN_PROB,
	   POOL_SIZE; //en tanto por 1

//Operador de reproducción
int REPROD_OPERATOR;

//Operador de reemplazo
int	REPLACE_OPERATOR;

//Peso del nº de cruces del individuo para el cálculo de probabilidades
double CROSS_WEIGHT;

//Peso de la diferencia de los pesos en la distribucion de carga
double	W_WEIGHT;

//Porcentaje que indica el valor de convergencia
double CONVERGENCIA;

//Peso máximo que puede soportar una caja
double W_LIMIT;

//Percentiles usados en la distribución de cajas en las listas (peso, volumen y superficie)
double	PERC_W, PERC_V, PERC_A; //Estos son los configurados
double pc_pes, pc_vol, pc_sup;	//Estos son los calculados

class Type;
vector<Type> TIPOS;

double absolute(double x)
{
	if(x <0)
		return x*(-1);
	else
		return x;

}

#endif